import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import openpyxl
import hashlib
import os

# 加密函数：将字符串进行 SHA-256 加密
def encrypt_tac(value):
    # 使用 SHA-256 进行加密
    sha256_hash = hashlib.sha256(str(value).encode()).hexdigest()
    return sha256_hash

# 处理文件函数
def process_file():
    try:
        # 检查文件路径和列选择
        file_path = file_path_var.get()
        if not file_path:
            messagebox.showerror("错误", "请选择一个文件！")
            return

        # 获取用户选择的加密列索引
        selected_column = column_combobox.current() + 1  # 获取下拉框中选择的列索引，openpyxl 从 1 开始
        if selected_column == 0:
            messagebox.showerror("错误", "请选择要加密的列！")
            return

        # 获取输出路径
        save_dir = save_path_var.get()
        if not save_dir:
            messagebox.showerror("错误", "请选择输出文件保存路径！")
            return

        # 使用 openpyxl 打开 Excel 文件
        wb = openpyxl.load_workbook(file_path)
        sheet = wb.active  # 获取当前活动的工作表

        # 获取表头行（假设第一行是表头）
        header = [cell.value for cell in sheet[1]]
        
        # 在表格后添加 'Encrypted Column' 列
        sheet.cell(row=1, column=len(header) + 1, value=f"Encrypted {header[selected_column - 1]}")

        # 获取总行数
        total_rows = sheet.max_row - 1  # 减去表头行

        # 更新进度条最大值
        progress_bar['maximum'] = total_rows
        progress_bar['value'] = 0

        # 对每一行的选定列进行加密
        for row in range(2, sheet.max_row + 1):  # 从第二行开始，跳过表头
            column_value = sheet.cell(row=row, column=selected_column).value
            if column_value:  # 如果选定列有值
                encrypted_value = encrypt_tac(column_value)
                sheet.cell(row=row, column=len(header) + 1, value=encrypted_value)

            # 更新进度条
            progress_bar['value'] = row - 1
            root.update_idletasks()  # 刷新界面以显示进度

        # 生成输出文件路径
        output_path = os.path.join(save_dir, "encrypted_output.xlsx")
        wb.save(output_path)

        messagebox.showinfo("成功", f"文件处理并保存成功！\n文件已保存为: {output_path}")
        
    except Exception as e:
        messagebox.showerror("错误", f"处理文件时发生错误: {e}")

# 创建主窗口
root = tk.Tk()
root.title("TAC SHA-256 加密工具")
root.geometry("500x400")  # 调整窗口大小

# 文件选择部分
file_path_var = tk.StringVar()

def select_file():
    file_path = filedialog.askopenfilename(title="选择 Excel 文件", filetypes=[("Excel Files", "*.xlsx;*.xls")])
    if file_path:
        file_path_var.set(file_path)
        file_label.config(text=f"选择文件: {os.path.basename(file_path)}")
        load_columns(file_path)  # 加载列标题

# 创建文件选择标签和按钮
file_label = tk.Label(root, text="请选择文件：", anchor="w", width=20)
file_label.grid(row=0, column=0, padx=10, pady=10)

file_button = tk.Button(root, text="选择文件", command=select_file, width=15)
file_button.grid(row=0, column=1, padx=10, pady=10)

# 选择加密列部分
column_label = tk.Label(root, text="选择加密列：", anchor="w", width=20)
column_label.grid(row=1, column=0, padx=10, pady=10, sticky="w")

column_combobox = ttk.Combobox(root, state="readonly", width=30)
column_combobox.grid(row=1, column=1, padx=10, pady=10)

# 载入文件的列标题到下拉框
def load_columns(file_path):
    wb = openpyxl.load_workbook(file_path)
    sheet = wb.active
    header = [cell.value for cell in sheet[1]]  # 获取表头
    column_combobox['values'] = header  # 更新列选择下拉框
    if header:
        column_combobox.set(header[0])  # 默认选中第一列

# 保存路径选择部分
save_path_var = tk.StringVar()

def select_save_path():
    directory = filedialog.askdirectory(title="选择保存文件的文件夹")
    if directory:
        save_path_var.set(directory)
        save_label.config(text=f"加密文件输出路径: {directory}")

# 创建保存路径选择标签和按钮
save_label = tk.Label(root, text="加密文件输出路径：", anchor="w", width=20)
save_label.grid(row=2, column=0, padx=10, pady=10, sticky="w")

save_button = tk.Button(root, text="选择路径", command=select_save_path, width=15)
save_button.grid(row=2, column=1, padx=10, pady=10)

# 添加进度条
progress_bar = ttk.Progressbar(root, orient="horizontal", length=400, mode="determinate")
progress_bar.grid(row=3, column=0, columnspan=2, padx=10, pady=20)

# 创建开始加密按钮
process_button = tk.Button(root, text="开始加密", command=process_file, height=2, width=20)
process_button.grid(row=4, column=0, columnspan=2, pady=20)

# 启动 GUI 界面
root.mainloop()
